﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Kang.ExtendMethod
{
    public static class FileExtendMethod
    {
        /// <summary>
        /// 返回指定路径地址的文件名（包含扩展名）
        /// </summary>
        /// <param name="str">文件路径</param>
        /// <returns>返回文件名（含扩展名）</returns>
        public static string GetFilename(this string str)
        {
            if (str.IsBlank())
            {
                return default;
            }
            return Path.GetFileName(str);
        }

        /// <summary>
        /// 返回指定路径地址的文件名（不含扩展名）
        /// </summary>
        /// <param name="str">文件路径</param>
        /// <returns>返回文件名（不含扩展名）</returns>
        public static string GetFilenameWithoutExtension(this string str)
        {
            if (str.IsBlank())
            {
                return default;
            }
            return Path.GetFileNameWithoutExtension(str);
        }

        /// <summary>
        /// 返回指定路径地址的扩展名（包含点）
        /// </summary>
        /// <param name="str">文件路径</param>
        /// <returns>返回文件扩展名（包含点）</returns>
        public static string GetExtension(this string str)
        {
            if (str.IsBlank())
            {
                return default;
            }
            return Path.GetExtension(str.StringTrim());
        }

        /// <summary>
        /// 返回指定路径地址的扩展名（不包含点）
        /// </summary>
        /// <param name="str">文件路径</param>
        /// <returns>返回文件扩展名（不包含点）</returns>
        public static string GetExtensionWithoutPoint(this string str)
        {
            if (str.IsBlank())
            {
                return default;
            }
            if (str.StringTrim().Length == 1)
            {
                if (".".Equals(str.StringTrim()))
                {
                    return default;
                }
                else
                {
                    return str.StringTrim();
                }
            }
            return Path.GetExtension(str.StringTrim()).Substring(1);
        }

        /// <summary>
        /// 写出到文件，文件存在，则会覆盖
        /// </summary>
        /// <param name="str">需要写入到文件里的内容</param>
        /// <param name="path">文件路径</param>
        /// <param name="encoding">字符串编码格式</param>
        public static void WriteToFile(this string str, string path, Encoding encoding = null)
        {
            if(encoding == null)
            {
                encoding = Encoding.UTF8;
            }
            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                byte[] data = str.GetBytes(encoding);
                fs.Write(data, 0, data.Length);
                fs.Flush();
            }
        }

        /// <summary>
        /// 写出到文件，文件存在，则会覆盖
        /// </summary>
        /// <param name="data">需要写入到文件里的内容</param>
        /// <param name="path">文件路径</param>
        public static void WriteToFile(this string path, byte[] data)
        {
            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                fs.Write(data, 0, data.Length);
                fs.Flush();
            }
        }

        /// <summary>
        /// 安全方法，复制文件
        /// </summary>
        /// <param name="sourceFileName">源文件路径</param>
        /// <param name="destFileName">目标文件路径</param>
        public static void FileCopy(this string sourceFileName, string destFileName)
        {
            if (!sourceFileName.AsFilePathAndExists())
            {
                return;
            }
            File.Copy(sourceFileName, destFileName, true);
        }

        /// <summary>
        /// 判断文件是否存在
        /// </summary>
        /// <returns>判断结果</returns>
        public static bool AsFilePathAndExists(this string str)
        {
            if (str.IsBlank())
            {
                return false;
            }
            return File.Exists(str);
        }

        /// <summary>
        /// 判断文件夹是否存在
        /// </summary>
        /// <returns>判断结果</returns>
        public static bool AsDirectoryPathAndExists(this string str)
        {
            if (str.IsBlank())
            {
                return false;
            }
            return Directory.Exists(str);
        }

        /// <summary>
        /// 判断文件夹是否存在
        /// </summary>
        /// <returns>判断结果</returns>
        public static DirectoryInfo AsDirectoryPathAndCreate(this string str)
        {
            if (str.IsBlank())
            {
                return default;
            }
            return Directory.CreateDirectory(str);
        }
    }
}
